package com.datastructures2.netFlow;

/**
 * 流量网络中的边(剩余网络)
 *  原网络每条边对应剩余网络1到2条边，对于原网络每条从v到w的边e
 *   fe表示流量，ce表示容量
 *  1.如果fe为正，则边w->v加入剩余网络，且容量为为fe
 *  2.如果fe<ce，则边v->w加入剩余网络，容量为ce-fe
 *
 *  即
 *  1.如果v-w的边fe为0，则剩余网络只有一条容量为ce的边v-w
 *  2.如果该边饱和，即fe=ce，则只有一条容量为fe的边w-v
 *  3.如果不饱和也不空，则有响应容量的w-v和v-w两条边
 * @author MaoLin Wang
 * @date 2020/3/322:31
 */
public class FlowEdge {
    private final int from;
    private final int to;
    /**
     * 容量
     */
    private final double capacity;

    /**
     * 流量
     */
    private double flow;

    public FlowEdge(int from, int to, double capacity) {
        this.from = from;
        this.to = to;
        this.capacity = capacity;
        this.flow=0.0;
    }

    public int from(){
        return from;
    }
    public int to(){
        return to;
    }
    public double capacity(){
        return capacity;
    }
    public double flow(){
        return flow;
    }

    public int other(int vertex){
        if (vertex==this.from){
            return this.to;
        }else if (vertex==this.to){
            return this.from;
        }else {
            throw new IllegalArgumentException("参数错误");
        }
    }

    /**
     * vertex的剩余容量
     * @param vertex
     * @return
     */
    public double residualCapacity(int vertex){
        if (vertex==from){
            return flow;
        }else if (vertex==to){
            return capacity-flow;
        }else throw new IllegalArgumentException("参数错误");
    }

    /**
     * 将v的流量增加delta
     * 沿给定顶点的方向增加边缘上的流。
     *      如果{@code vertex}是尾顶点，这将使边缘的流增加{@code delta}；
     *      如果{@code vertex}是头顶点，则将{@code delta}减少边缘上的流。
     * @param v
     * @param delta
     */
    public void addResidualFlowTo(int v,double delta){
        if (v==from){
            flow-=delta;
        }else if (v==to){
            flow+=delta;
        }else throw new IllegalArgumentException("参数错误");
    }
    public String toString() {
        return from+"->" + to + " " + flow + "/" + capacity;
    }

}

